/*!
 * # 参数列表实体类:
 *  Login - 登录
 * 
 * # 描述:
 *  使用指定的用户名和密码登录到系统。
 * 
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Authority.Authentication.Args
{
    /// <summary>
    /// 功能 登录 的参数列表。
    /// </summary>
    [global::Pittypat.Function(Transaction = true)]
    public sealed class Login : global::Pittypat.FunctionArgs
    {
        #region 构造函数

        /// <summary>
        /// 初始化 Login 类的一个新实例。
        /// </summary>
        public Login()
        {
            // 登录名称
            this.Name = null;
            // 登录密码
            this.Password = null;
            // 用户令牌
            this.Token = null;
            // 用户信息
            this.User = null;
        }

        #endregion

        #region 属性

        /// <summary>
        /// 获取或者设置登录名称。
        /// </summary>
        /// <remarks>
        /// 用户的登录名称、编号、手机号码或电子邮件地址。
        /// </remarks>
        [global::Pittypat.Parameter(0, MaxLength = 50)]
        public @string? Name { get; set; }

        /// <summary>
        /// 获取或者设置登录密码。
        /// </summary>
        /// <remarks>
        /// 用户登录密码的明文。
        /// </remarks>
        [global::Pittypat.Parameter(1, MaxLength = 30)]
        public @string? Password { get; set; }

        /// <summary>
        /// 获取或者设置用户令牌。
        /// </summary>
        /// <remarks>
        /// 用户登录令牌。
        /// </remarks>
        [global::Pittypat.Parameter(2, Direction = global::Pittypat.ParameterDirection.Out, FixedLength = true, MaxLength = 36)]
        public @binary? Token { get; set; }

        /// <summary>
        /// 获取或者设置用户信息。
        /// </summary>
        /// <remarks>
        /// 登录用户的用户信息。
        /// </remarks>
        [global::Pittypat.Parameter(3, Direction = global::Pittypat.ParameterDirection.Out)]
        public global::Waln.Authority.Authentication.Data.User User { get; set; }

        /// <summary>
        /// 获取或者设置指定名称的参数值。
        /// </summary>
        /// <param name="name">参数名称，不区分大小写。</param>
        /// <returns>目标名称的参数值。如果参数不存在，则返回 null。</returns>
        /// <exception cref="global::System.ArgumentException">设置参数值时发现参数不存在。</exception>
        public override object this[string name]
        {
            get
            {
                if (string.IsNullOrEmpty(name))
                {
                    return null;
                }

                switch (name.ToLower())
                {
                    case "name":
                        return this.Name;
                    case "password":
                        return this.Password;
                    case "token":
                        return this.Token;
                    case "user":
                        return this.User;
                    default:
                        return null;
                }
            }
            set
            {
                if (string.IsNullOrEmpty(name))
                {
                    throw new global::System.ArgumentException("没有提供有效的参数名称。", "name");
                }

                switch (name.ToLower())
                {
                    case "name":
                        this.Name = (@string?)value;
                        break;
                    case "password":
                        this.Password = (@string?)value;
                        break;
                    case "token":
                        this.Token = (@binary?)value;
                        break;
                    case "user":
                        this.User = (global::Waln.Authority.Authentication.Data.User)value;
                        break;
                    default:
                        throw new global::System.ArgumentException(name + " 不是 " + this.GetType().Name + " 的有效参数属性名称。", "name");
                }
            }
        }

        #endregion

        #region 方法

        /// <summary>
        /// 将当前对象作为 JSON 字符串写入指定的文本流。
        /// </summary>
        /// <param name="writer">目标文本流。</param>
        /// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
        public override void Write(global::System.IO.TextWriter writer)
        {
            if (writer == null)
            {
                throw new global::System.ArgumentNullException("writer");
            }

            writer.Write('{');

            // 登录名称
            writer.Write("\"name\":");
            this.Name.Write(writer);
            writer.Write(',');

            // 登录密码
            writer.Write("\"password\":");
            this.Password.Write(writer);
            writer.Write(',');

            // 用户令牌
            writer.Write("\"token\":");
            this.Token.Write(writer);
            writer.Write(',');

            // 用户信息
            writer.Write("\"user\":");
            if (this.User == null)
            {
                writer.Write("null");
            }
            else
            {
                this.User.Write(writer);
            }

            writer.Write('}');
        }

        #endregion
    }
}
